home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / sun / volume2 / contool3.0 / part05 < prev    next >
Encoding:
Internet Message Format  |  1990-09-25  |  29.0 KB

  1. Path: uunet!snorkelwacker!apple!sun-barr!rutgers!aramis.rutgers.edu!mcgrew
  2. From: mcgrew@aramis.rutgers.edu (Charles Mcgrew)
  3. Newsgroups: comp.sources.sun
  4. Subject: v02i024:  Contool 3.0, Part05/06
  5. Message-ID: <Sep.25.16.13.02.1990.25578@aramis.rutgers.edu>
  6. Date: 25 Sep 90 20:13:03 GMT
  7. Organization: Rutgers Univ., New Brunswick, N.J.
  8. Lines: 915
  9. Approved: mcgrew@aramis.rutgers.edu
  10.  
  11. Submitted-by: chuck@trantor.harris-atd.com (Chuck Musciano)
  12. Posting-number: Volume 2, Issue 24
  13. Archive-name: contool3.0/part05
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then unpack
  17. # it by saving it into a file and typing "sh file".  To overwrite existing
  18. # files, type "sh file -c".  You can also feed this as standard input via
  19. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  20. # will see the following message at the end:
  21. #        "End of archive 5 (of 6)."
  22. # Contents:  filters.c
  23. # Wrapped by chuck@melmac on Fri Aug 17 10:00:53 1990
  24. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  25. if test -f 'filters.c' -a "${1}" != "-c" ; then 
  26.   echo shar: Will not clobber existing file \"'filters.c'\"
  27. else
  28. echo shar: Extracting \"'filters.c'\" \(26766 characters\)
  29. sed "s/^X//" >'filters.c' <<'END_OF_FILE'
  30. X/************************************************************************/
  31. X/*    Copyright 1988-1990 by Chuck Musciano and Harris Corporation    */
  32. X/*                                    */
  33. X/*    Permission to use, copy, modify, and distribute this software    */
  34. X/*    and its documentation for any purpose and without fee is    */
  35. X/*    hereby granted, provided that the above copyright notice    */
  36. X/*    appear in all copies and that both that copyright notice and    */
  37. X/*    this permission notice appear in supporting documentation, and    */
  38. X/*    that the name of Chuck Musciano and Harris Corporation not be    */
  39. X/*    used in advertising or publicity pertaining to distribution    */
  40. X/*    of the software without specific, written prior permission.    */
  41. X/*    Chuck Musciano and Harris Corporation make no representations    */
  42. X/*    about the suitability of this software for any purpose.  It is    */
  43. X/*    provided "as is" without express or implied warranty.  This     */
  44. X/*    software may not be sold without the prior explicit permission    */
  45. X/*    of Harris Corporation.                        */
  46. X/************************************************************************/
  47. X
  48. X/************************************************************************/
  49. X/*                                    */
  50. X/*    filters.c    contool filters dialog manager            */
  51. X/*                                    */
  52. X/************************************************************************/
  53. X
  54. X#include    <stdio.h>
  55. X#include    <sys/param.h>
  56. X#include    <sys/types.h>
  57. X#include    <xview/xview.h>
  58. X#include    <xview/panel.h>
  59. X#include    <xview/notice.h>
  60. X#include    <xview/xv_xrect.h>
  61. X
  62. X#include    "manifest.h"
  63. X#include    "contool.h"
  64. X#include    "contool_ui.h"
  65. X
  66. XEXPORT    Filter    *filters = NULL;
  67. X
  68. XPUBLIC    contool_base_objects    *contool_base;
  69. X
  70. XPRIVATE    short    single_bits[] = {
  71. X#include    "images/single.icon"
  72. X              };
  73. X
  74. XPRIVATE    short    range_bits[] = {
  75. X#include    "images/range.icon"
  76. X              };
  77. X
  78. XPRIVATE    short    empty_bits[] = {
  79. X#include    "images/empty.icon"
  80. X              };
  81. X
  82. XPRIVATE    Filter    *edit_set = NULL, *clipboard = NULL;
  83. XPRIVATE    contool_filters_objects    *contool_filters = NULL;
  84. XPRIVATE    Server_image    single, range, empty;
  85. X
  86. X/************************************************************************/
  87. XPRIVATE    int    selection_count()
  88. X
  89. X{    int    i, s, total;
  90. X
  91. X    total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
  92. X    for (i = s = 0; i < total; i++)
  93. X       if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
  94. X          s++;
  95. X    return(s);
  96. X}
  97. X
  98. X/************************************************************************/
  99. XPRIVATE    int    curr_selection()
  100. X
  101. X{    int    i, total;
  102. X
  103. X    for (i = 0, total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS); i < total; i++)
  104. X       if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
  105. X          break;
  106. X    if (i >= total)
  107. X       fprintf(stderr, "No item selected!\n");
  108. X    return(i);
  109. X}
  110. X
  111. X/************************************************************************/
  112. XPRIVATE    Filter    *duplicate_filter(f)
  113. X
  114. XFilter    *f;
  115. X
  116. X{    Filter    *new;
  117. X
  118. X    new = (Filter *) malloc(sizeof(Filter));
  119. X    *new = *f;
  120. X    new->start = strsave(f->start);
  121. X    new->stop = strsave(f->stop);
  122. X    compile_exp(new, new->start, new->stop);
  123. X    new->command = strsave(f->command);
  124. X    new->comment = strsave(f->comment);
  125. X    new->next = NULL;
  126. X    return(new);
  127. X}
  128. X
  129. X/************************************************************************/
  130. XPRIVATE    Filter    *duplicate_list(list)
  131. X
  132. XFilter    *list;
  133. X
  134. X{    Filter    *f, *head = NULL, *curr;
  135. X
  136. X    for (f = list; f; f = f->next)
  137. X       if (head == NULL)
  138. X          head = curr = duplicate_filter(f);
  139. X       else {
  140. X          curr->next = duplicate_filter(f);
  141. X          curr = curr->next;
  142. X          }
  143. X    return(head);
  144. X}
  145. X
  146. X/************************************************************************/
  147. XPRIVATE    free_filter(f)
  148. X
  149. XFilter    *f;
  150. X
  151. X{
  152. X    cond_free(f->start);
  153. X    cond_free(f->start_re);
  154. X    cond_free(f->stop);
  155. X    cond_free(f->stop_re);
  156. X    cond_free(f->command);
  157. X    cond_free(f->comment);
  158. X    free(f);
  159. X}
  160. X
  161. X/************************************************************************/
  162. XEXPORT    free_list(list)
  163. X
  164. XFilter    *list;
  165. X
  166. X{    Filter    *next;
  167. X
  168. X    for ( ; list; list = next) {
  169. X       next = list->next;
  170. X       free_filter(list);
  171. X       }
  172. X}
  173. X
  174. X/************************************************************************/
  175. XPRIVATE    update_controls()
  176. X
  177. X{    Filter    *f;
  178. X    int    i;
  179. X
  180. X    if (selection_count() == 1) {
  181. X       for (f = edit_set, i = 0; f; f = f->next, i++)
  182. X          if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
  183. X             break;
  184. X       if (f == NULL) {
  185. X          error("Internal error: filters do not match scrolling list!");
  186. X          return;
  187. X          }
  188. X       xv_set(contool_filters->filter_update, PANEL_INACTIVE, FALSE, NULL);
  189. X       xv_set(contool_filters->filter_type, PANEL_INACTIVE, FALSE, PANEL_VALUE, f->stop? 1 : 0, NULL);
  190. X       xv_set(contool_filters->start, PANEL_INACTIVE, FALSE, PANEL_VALUE, is_null(f->start), NULL);
  191. X       xv_set(contool_filters->stop, PANEL_INACTIVE, f->stop == NULL, PANEL_VALUE, is_null(f->stop), NULL);
  192. X       xv_set(contool_filters->comment, PANEL_INACTIVE, FALSE, PANEL_VALUE, is_null(f->comment), NULL);
  193. X       xv_set(contool_filters->ignore, PANEL_INACTIVE, FALSE, PANEL_VALUE, f->save? 0 : 1, NULL);
  194. X       if (f->save) {
  195. X          i = 0;
  196. X          if (f->beep) {
  197. X             i |= BEEP_BIT;
  198. X             xv_set(contool_filters->filter_beep_count, PANEL_INACTIVE, FALSE, PANEL_VALUE, f->beep, NULL);
  199. X             xv_set(contool_filters->filter_beep_times, PANEL_INACTIVE, FALSE, NULL);
  200. X             }
  201. X          else {
  202. X             xv_set(contool_filters->filter_beep_count, PANEL_INACTIVE, TRUE, NULL);
  203. X             xv_set(contool_filters->filter_beep_times, PANEL_INACTIVE, TRUE, NULL);
  204. X             }
  205. X          if (f->command) {
  206. X             i |= COMMAND_BIT;
  207. X             xv_set(contool_filters->filter_command, PANEL_INACTIVE, FALSE, PANEL_VALUE, f->command, NULL);
  208. X             xv_set(contool_filters->filter_beep_times, PANEL_INACTIVE, FALSE, NULL);
  209. X             }
  210. X          else
  211. X             xv_set(contool_filters->filter_command, PANEL_INACTIVE, TRUE, NULL);
  212. X          if (f->flash)
  213. X             i |= FLASH_BIT;
  214. X          if (f->open)
  215. X             i |= OPEN_BIT;
  216. X          if (f->stamp)
  217. X             i |= STAMP_BIT;
  218. X          xv_set(contool_filters->action, PANEL_INACTIVE, FALSE, PANEL_VALUE, i, NULL);
  219. X          }
  220. X       else {
  221. X          xv_set(contool_filters->action, PANEL_INACTIVE, TRUE, NULL);
  222. X          xv_set(contool_filters->filter_beep_count, PANEL_INACTIVE, TRUE, NULL);
  223. X          xv_set(contool_filters->filter_beep_times, PANEL_INACTIVE, TRUE, NULL);
  224. X          xv_set(contool_filters->filter_command, PANEL_INACTIVE, TRUE, NULL);
  225. X          }
  226. X       }
  227. X    else {
  228. X       xv_set(contool_filters->filter_update,     PANEL_INACTIVE, TRUE, NULL);
  229. X       xv_set(contool_filters->filter_type,       PANEL_INACTIVE, TRUE, NULL);
  230. X       xv_set(contool_filters->start,             PANEL_INACTIVE, TRUE, NULL);
  231. X       xv_set(contool_filters->stop,              PANEL_INACTIVE, TRUE, NULL);
  232. X       xv_set(contool_filters->comment,           PANEL_INACTIVE, TRUE, NULL);
  233. X       xv_set(contool_filters->ignore,            PANEL_INACTIVE, TRUE, NULL);
  234. X       xv_set(contool_filters->action,            PANEL_INACTIVE, TRUE, NULL);
  235. X       xv_set(contool_filters->filter_beep_count, PANEL_INACTIVE, TRUE, NULL);
  236. X       xv_set(contool_filters->filter_beep_times, PANEL_INACTIVE, TRUE, NULL);
  237. X       xv_set(contool_filters->filter_command,    PANEL_INACTIVE, TRUE, NULL);
  238. X       }
  239. X}
  240. X
  241. X/************************************************************************/
  242. XPRIVATE    init_filters()
  243. X
  244. X{    Filter    *f;
  245. X    int    i, total;
  246. X
  247. X    xv_set(contool_filters->filter_list, PANEL_PAINT, PANEL_NO_CLEAR, NULL);
  248. X    for (total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS); total > 0; total--)
  249. X       xv_set(contool_filters->filter_list, PANEL_LIST_DELETE, total - 1, NULL);
  250. X    xv_set(contool_filters->filter_list, PANEL_PAINT, PANEL_CLEAR, NULL);
  251. X    free_list(edit_set);
  252. X    edit_set = duplicate_list(filters);
  253. X    for (i = 0, f = edit_set; f; f = f->next, i++)
  254. X       xv_set(contool_filters->filter_list,
  255. X                PANEL_LIST_INSERT, i,
  256. X                PANEL_LIST_GLYPH,  i, f->stop? range : single,
  257. X                PANEL_LIST_STRING, i, f->start,
  258. X             NULL);
  259. X    update_controls();
  260. X}
  261. X
  262. X/************************************************************************/
  263. XPRIVATE    insert_item(pos)
  264. X
  265. Xint    pos;
  266. X
  267. X{    int    i, total;
  268. X    Filter    *f, *t;
  269. X
  270. X    total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
  271. X    for (i = 0; i < total; i++)
  272. X       if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
  273. X          xv_set(contool_filters->filter_list, PANEL_LIST_SELECT, i, FALSE, NULL);
  274. X    xv_set(contool_filters->filter_list, PANEL_LIST_INSERT, pos, NULL);
  275. X    xv_set(contool_filters->filter_list, PANEL_LIST_GLYPH, pos, empty, NULL);
  276. X    xv_set(contool_filters->filter_list, PANEL_LIST_SELECT, pos, TRUE, NULL);
  277. X    if (pos == 0) {
  278. X       f = (Filter *) malloc(sizeof(Filter));
  279. X       f->next = edit_set;
  280. X       edit_set = f;
  281. X       }
  282. X    else {
  283. X       for (i = 1, f = edit_set; i < pos; i++, f = f->next)
  284. X          ;
  285. X       t = f->next;
  286. X       f->next = (Filter *) malloc(sizeof(Filter));
  287. X       f = f->next;
  288. X       f->next = t;
  289. X       }
  290. X    f->start = f->stop = f->comment = NULL;
  291. X    f->beep = defaults.beep;
  292. X    f->command = strsave(defaults.command);
  293. X    f->flash = defaults.flash;
  294. X    f->open = defaults.open;
  295. X    f->stamp = defaults.stamp;
  296. X    f->save = TRUE;
  297. X    update_controls();
  298. X/* update the scrolling view */
  299. X}
  300. X
  301. X/************************************************************************/
  302. XPRIVATE    paste_items(pos)
  303. X
  304. Xint    pos;
  305. X
  306. X{    int    i;
  307. X    Filter    *new, *tail, *f;
  308. X
  309. X    new = duplicate_list(clipboard);
  310. X    for (f = new, i = 0; f; f = f->next, i++) {
  311. X       xv_set(contool_filters->filter_list, PANEL_LIST_INSERT, pos + i, 0);
  312. X       xv_set(contool_filters->filter_list,
  313. X                PANEL_LIST_STRING, pos + i, f->start,
  314. X                PANEL_LIST_GLYPH,  pos + i, f->stop? range : single,
  315. X             NULL);
  316. X       tail = f;
  317. X       }
  318. X    if (pos == 0) {
  319. X       tail->next = edit_set;
  320. X       edit_set = new;
  321. X       }
  322. X    else {
  323. X       for (i = 1, f = edit_set; i < pos; i++, f = f->next)
  324. X          ;
  325. X       tail->next = f->next;
  326. X       f->next = new;
  327. X       }
  328. X    update_controls();
  329. X}
  330. X
  331. X/************************************************************************/
  332. XPRIVATE    int    update_values(f, flag)
  333. X
  334. XFilter    *f;
  335. Xint    flag;
  336. X
  337. X{    char    *start, *stop, *msg;
  338. X    int    i;
  339. X
  340. X    start = (char *) xv_get(contool_filters->start, PANEL_VALUE);
  341. X    if (is_empty(start)) {
  342. X       if (flag)
  343. X          error("You must specify a starting message pattern");
  344. X       return(FALSE);
  345. X       }
  346. X    if (xv_get(contool_filters->filter_type, PANEL_VALUE) == 1)
  347. X       stop = (char *) xv_get(contool_filters->stop, PANEL_VALUE);
  348. X    else
  349. X       stop = NULL;
  350. X    if (msg = compile_exp(f, start, stop)) {
  351. X       if (flag)
  352. X          error(msg);
  353. X       return(FALSE);
  354. X       }
  355. X    if ((int) xv_get(contool_filters->ignore, PANEL_VALUE) == 0) {
  356. X       i = (int) xv_get(contool_filters->action, PANEL_VALUE);
  357. X       if (i & COMMAND_BIT)
  358. X          if (msg = (char *) xv_get(contool_filters->filter_command, PANEL_VALUE))
  359. X             f->command = strsave(msg);
  360. X          else {
  361. X             if (flag)
  362. X                error("You must specify a command for this filter");
  363. X             return(FALSE);
  364. X             }
  365. X       else
  366. X          f->command = NULL;
  367. X       if (i & BEEP_BIT)
  368. X          f->beep = (int) xv_get(contool_filters->filter_beep_count, PANEL_VALUE);
  369. X       else
  370. X          f->beep = 0;
  371. X       f->flash = (i & FLASH_BIT)? TRUE : FALSE;
  372. X       f->open = (i & OPEN_BIT)? TRUE : FALSE;
  373. X       f->stamp = (i & STAMP_BIT)? TRUE : FALSE;
  374. X       f->save = TRUE;
  375. X       }
  376. X    else
  377. X       f->save = FALSE;
  378. X    f->start = strsave(start);
  379. X    f->stop = strsave(stop);
  380. X    f->comment = strsave((char *) xv_get(contool_filters->comment, PANEL_VALUE));
  381. X    return(TRUE);
  382. X}
  383. X
  384. X/************************************************************************/
  385. XEXPORT    Menu_item    edit_filters(item, op)
  386. X
  387. XMenu_item    item;
  388. XMenu_generate    op;
  389. X
  390. X{    Filter    *f, *curr;
  391. X
  392. X    if (op == MENU_NOTIFY) {
  393. X       xv_set(contool_base->base, FRAME_BUSY, TRUE, NULL);
  394. X       if (contool_filters == NULL) {
  395. X          contool_filters = contool_filters_objects_initialize(NULL, contool_base->base);
  396. X          place_dialog(contool_base->base, contool_filters->filters);
  397. X          xv_set(contool_filters->filter_list, PANEL_LIST_ROW_HEIGHT, 16, NULL);
  398. X          single = (Server_image) xv_create(NULL, SERVER_IMAGE,
  399. X                                 XV_WIDTH, 16,
  400. X                                 XV_HEIGHT, 16,
  401. X                                 SERVER_IMAGE_BITS, single_bits,
  402. X                              0);
  403. X          range  = (Server_image) xv_create(NULL, SERVER_IMAGE,
  404. X                                 XV_WIDTH, 16,
  405. X                                 XV_HEIGHT, 16,
  406. X                                 SERVER_IMAGE_BITS, range_bits,
  407. X                              0);
  408. X          empty  = (Server_image) xv_create(NULL, SERVER_IMAGE,
  409. X                                 XV_WIDTH, 16,
  410. X                                 XV_HEIGHT, 16,
  411. X                                 SERVER_IMAGE_BITS, empty_bits,
  412. X                              0);
  413. X          }
  414. X       if (xv_get(contool_filters->filters, XV_SHOW) == FALSE) {
  415. X          edit_set = duplicate_list(filters);
  416. X          free_list(clipboard);
  417. X          clipboard = NULL;
  418. X          init_filters();
  419. X          }
  420. X       xv_set(contool_filters->filters, XV_SHOW, TRUE, NULL);
  421. X       xv_set(contool_base->base, FRAME_BUSY, FALSE, NULL);
  422. X       }
  423. X    return item;
  424. X}
  425. X
  426. X/************************************************************************/
  427. XEXPORT    int    filter_notify(item, string, client_data, op, event)
  428. X
  429. XPanel_item    item;
  430. Xchar        *string;
  431. XXv_opaque    client_data;
  432. XPanel_list_op    op;
  433. XEvent        *event;
  434. X
  435. X{    
  436. X    if (op == PANEL_LIST_OP_DESELECT || op == PANEL_LIST_OP_SELECT)
  437. X       update_controls();
  438. X    return XV_OK;
  439. X}
  440. X
  441. X/************************************************************************/
  442. XEXPORT    Menu    filter_insert_handler(menu, op)
  443. X
  444. XMenu        menu;
  445. XMenu_generate    op;
  446. X
  447. X{
  448. X    xv_set(menu, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  449. X    xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  450. X    return menu;
  451. X}
  452. X
  453. X/************************************************************************/
  454. XEXPORT    Menu_item    insert_at_top(item, op)
  455. X
  456. XMenu_item    item;
  457. XMenu_generate    op;
  458. X
  459. X{
  460. X    xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  461. X    xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  462. X    if (op == MENU_NOTIFY)
  463. X       insert_item(0);
  464. X    return item;
  465. X}
  466. X
  467. X/************************************************************************/
  468. XEXPORT    Menu_item    insert_above(item, op)
  469. X
  470. XMenu_item    item;
  471. XMenu_generate    op;
  472. X
  473. X{
  474. X    xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  475. X    xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  476. X    if (op == MENU_DISPLAY)
  477. X       xv_set(item, MENU_INACTIVE, selection_count() != 1, NULL);
  478. X    else if (op == MENU_NOTIFY)
  479. X       insert_item(curr_selection());
  480. X    return item;
  481. X}
  482. X
  483. X/************************************************************************/
  484. XEXPORT    Menu_item    insert_below(item, op)
  485. X
  486. XMenu_item    item;
  487. XMenu_generate    op;
  488. X
  489. X{
  490. X    xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  491. X    xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  492. X    if (op == MENU_DISPLAY)
  493. X       xv_set(item, MENU_INACTIVE, selection_count() != 1, NULL);
  494. X    else if (op == MENU_NOTIFY)
  495. X       insert_item(curr_selection() + 1);
  496. X    return item;
  497. X}
  498. X
  499. X/************************************************************************/
  500. XEXPORT    Menu_item    insert_at_bottom(item, op)
  501. X
  502. XMenu_item    item;
  503. XMenu_generate    op;
  504. X
  505. X{
  506. X    xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  507. X    xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  508. X    if (op == MENU_NOTIFY)
  509. X       insert_item(xv_get(contool_filters->filter_list, PANEL_LIST_NROWS));
  510. X    return item;
  511. X}
  512. X
  513. X/************************************************************************/
  514. XEXPORT    Menu    filter_edit_handler(menu, op)
  515. X
  516. XMenu        menu;
  517. XMenu_generate    op;
  518. X
  519. X{
  520. X    xv_set(menu, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  521. X    xv_set(contool_filters->filter_insert, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  522. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  523. X    return menu;
  524. X}
  525. X
  526. X/************************************************************************/
  527. XEXPORT    Menu_item    filter_cut(item, op)
  528. X
  529. XMenu_item    item;
  530. XMenu_generate    op;
  531. X
  532. X{    int    i, total;
  533. X    Filter    *f, *prev, *curr = NULL;
  534. X
  535. X    xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  536. X    xv_set(contool_filters->filter_edit, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  537. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  538. X    if (op == MENU_DISPLAY)
  539. X       xv_set(item, MENU_INACTIVE, selection_count() == 0, NULL);
  540. X    else if (op == MENU_NOTIFY) {
  541. X       free_list(clipboard);
  542. X       clipboard = NULL;
  543. X       total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
  544. X       for (prev = NULL, f = edit_set, i = 0; i < total; i++, f = f->next)
  545. X          if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i)) {
  546. X             if (clipboard == NULL)
  547. X                clipboard = curr = f;
  548. X             else {
  549. X                curr->next = f;
  550. X                curr = curr->next;
  551. X                }
  552. X             if (prev == NULL)
  553. X                edit_set = f->next;
  554. X             else
  555. X                prev->next = f->next;
  556. X             xv_set(contool_filters->filter_list, PANEL_LIST_DELETE, i, NULL);
  557. X             i--;
  558. X             total--;
  559. X             }
  560. X          else
  561. X             prev = f;
  562. X       if (curr)
  563. X          curr->next = NULL;
  564. X       update_controls();
  565. X       xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  566. X       }
  567. X    return item;
  568. X}
  569. X
  570. X/************************************************************************/
  571. XEXPORT    Menu_item    filter_copy(item, op)
  572. X
  573. XMenu_item    item;
  574. XMenu_generate    op;
  575. X
  576. X{    int    i, total;
  577. X    Filter    *f, *curr;
  578. X
  579. X    xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  580. X    xv_set(contool_filters->filter_edit, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  581. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  582. X    if (op == MENU_DISPLAY)
  583. X       xv_set(item, MENU_INACTIVE, selection_count() == 0, NULL);
  584. X    else if (op == MENU_NOTIFY) {
  585. X       free_list(clipboard);
  586. X       clipboard = NULL;
  587. X       total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
  588. X       for (f = edit_set, i = 0; i < total; i++, f = f->next)
  589. X          if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
  590. X             if (clipboard == NULL)
  591. X                clipboard = curr = duplicate_filter(f);
  592. X             else {
  593. X                curr->next = duplicate_filter(f);
  594. X                curr = curr->next;
  595. X                }
  596. X       curr->next = NULL;
  597. X       xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  598. X       }
  599. X    return item;
  600. X}
  601. X
  602. X/************************************************************************/
  603. XEXPORT    Menu_item    filter_delete(item, op)
  604. X
  605. XMenu_item    item;
  606. XMenu_generate    op;
  607. X
  608. X{    int    i, total;
  609. X    Filter    *f, *prev, *temp = NULL, *curr;
  610. X
  611. X    xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  612. X    xv_set(contool_filters->filter_edit, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  613. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  614. X    if (op == MENU_DISPLAY)
  615. X       xv_set(item, MENU_INACTIVE, selection_count() == 0, NULL);
  616. X    else if (op == MENU_NOTIFY) {
  617. X       total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
  618. X       for (prev = NULL, f = edit_set, i = 0; i < total; i++, f = f->next)
  619. X          if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i)) {
  620. X             if (temp == NULL)
  621. X                temp = curr = f;
  622. X             else {
  623. X                curr->next = f;
  624. X                curr = curr->next;
  625. X                }
  626. X             if (prev == NULL)
  627. X                edit_set = f->next;
  628. X             else
  629. X                prev->next = f->next;
  630. X             xv_set(contool_filters->filter_list, PANEL_LIST_DELETE, i, NULL);
  631. X             i--;
  632. X             total--;
  633. X             }
  634. X          else
  635. X             prev = f;
  636. X       if (curr)
  637. X          curr->next = NULL;
  638. X       free_list(temp);
  639. X       update_controls();
  640. X       xv_set(item, MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  641. X       }
  642. X    return item;
  643. X}
  644. X
  645. X/************************************************************************/
  646. XEXPORT    Menu_item    filter_paste(item, op)
  647. X
  648. XMenu_item    item;
  649. XMenu_generate    op;
  650. X
  651. X{
  652. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  653. X    if (op == MENU_DISPLAY)
  654. X       xv_set(item, MENU_INACTIVE, clipboard == NULL, NULL);
  655. X    return item;
  656. X}
  657. X
  658. X/************************************************************************/
  659. XEXPORT    Menu_item    paste_at_top(item, op)
  660. X
  661. XMenu_item    item;
  662. XMenu_generate    op;
  663. X
  664. X{
  665. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  666. X    if (op == MENU_NOTIFY)
  667. X       paste_items(0);
  668. X    return item;
  669. X}
  670. X
  671. X/************************************************************************/
  672. XEXPORT    Menu_item    paste_above(item, op)
  673. X
  674. XMenu_item    item;
  675. XMenu_generate    op;
  676. X
  677. X{
  678. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  679. X    if (op == MENU_DISPLAY)
  680. X       xv_set(item, MENU_INACTIVE, selection_count() != 1, NULL);
  681. X    else if (op == MENU_NOTIFY)
  682. X       paste_items(curr_selection());
  683. X    return item;
  684. X}
  685. X
  686. X/************************************************************************/
  687. XEXPORT    Menu_item    paste_below(item, op)
  688. X
  689. XMenu_item    item;
  690. XMenu_generate    op;
  691. X
  692. X{
  693. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  694. X    if (op == MENU_DISPLAY)
  695. X       xv_set(item, MENU_INACTIVE, selection_count() != 1, NULL);
  696. X    else if (op == MENU_NOTIFY)
  697. X       paste_items(curr_selection() + 1);
  698. X    return item;
  699. X}
  700. X
  701. X/************************************************************************/
  702. XEXPORT    Menu_item    paste_at_bottom(item, op)
  703. X
  704. XMenu_item    item;
  705. XMenu_generate    op;
  706. X
  707. X{
  708. X    xv_set(xv_get(contool_filters->filter_edit, PANEL_ITEM_MENU), MENU_NOTIFY_STATUS, XV_ERROR, NULL);
  709. X    if (op == MENU_NOTIFY)
  710. X       paste_items((int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS));
  711. X    return item;
  712. X}
  713. X
  714. X/************************************************************************/
  715. XEXPORT    void    filter_update(item, event)
  716. X
  717. XPanel_item    item;
  718. XEvent        *event;
  719. X
  720. X{    int    i, curr;
  721. X    Filter    *f;
  722. X
  723. X    xv_set(item, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  724. X
  725. X    curr = curr_selection();
  726. X    for (i = 0, f = edit_set; i < curr; i++, f = f->next)
  727. X       ;
  728. X    if (update_values(f, TRUE))
  729. X       xv_set(contool_filters->filter_list,
  730. X             PANEL_LIST_STRING, curr, f->start,
  731. X             PANEL_LIST_GLYPH,  curr, f->stop? range : single,
  732. X              NULL);
  733. X}
  734. X
  735. X/************************************************************************/
  736. XEXPORT    void    set_filter_type(item, value, event)
  737. X
  738. XPanel_item    item;
  739. Xint        value;
  740. XEvent        *event;
  741. X
  742. X{
  743. X    xv_set(contool_filters->stop, PANEL_INACTIVE, value == 0, NULL);
  744. X}
  745. X
  746. X/************************************************************************/
  747. XEXPORT    void    set_filter_action(item, value, event)
  748. X
  749. XPanel_item    item;
  750. Xint        value;
  751. XEvent        *event;
  752. X
  753. X{    contool_filters_objects    *ip = (contool_filters_objects *) xv_get(item, XV_KEY_DATA, INSTANCE);
  754. X
  755. X    if (value == 0) { /* save this message */
  756. X       xv_set(ip->action,            PANEL_INACTIVE, FALSE, NULL);
  757. X       xv_set(ip->filter_beep_count, PANEL_INACTIVE, !((int) xv_get(ip->action, PANEL_VALUE) & BEEP_BIT), NULL);
  758. X       xv_set(ip->filter_beep_times, PANEL_INACTIVE, !((int) xv_get(ip->action, PANEL_VALUE) & BEEP_BIT), NULL);
  759. X       xv_set(ip->filter_command,    PANEL_INACTIVE, !((int) xv_get(ip->action, PANEL_VALUE) & COMMAND_BIT), NULL);
  760. X       }
  761. X    else { /* ignore this message */
  762. X       xv_set(ip->action,            PANEL_INACTIVE, TRUE, NULL);
  763. X       xv_set(ip->filter_beep_count, PANEL_INACTIVE, TRUE, NULL);
  764. X       xv_set(ip->filter_beep_times, PANEL_INACTIVE, TRUE, NULL);
  765. X       xv_set(ip->filter_command,    PANEL_INACTIVE, TRUE, NULL);
  766. X       }
  767. X}
  768. X
  769. X/************************************************************************/
  770. XEXPORT    void    set_match_action(item, value, event)
  771. X
  772. XPanel_item    item;
  773. Xunsigned int    value;
  774. XEvent        *event;
  775. X
  776. X{    contool_filters_objects    *ip = (contool_filters_objects *) xv_get(item, XV_KEY_DATA, INSTANCE);
  777. X    
  778. X    xv_set(ip->filter_beep_count, PANEL_INACTIVE, !(value & BEEP_BIT), NULL);
  779. X    xv_set(ip->filter_beep_times, PANEL_INACTIVE, !(value & BEEP_BIT), NULL);
  780. X    xv_set(ip->filter_command,    PANEL_INACTIVE, !(value & COMMAND_BIT), NULL);
  781. X}
  782. X
  783. X/************************************************************************/
  784. XEXPORT    void    filter_done(frame)
  785. X
  786. XFrame        frame;
  787. X
  788. X{
  789. X    free_list(edit_set);
  790. X    edit_set = NULL;
  791. X    free_list(clipboard);
  792. X    clipboard = NULL;
  793. X    xv_set(frame, XV_SHOW, FALSE, 0);
  794. X}
  795. X
  796. X/************************************************************************/
  797. XPRIVATE    int    check_for_update()
  798. X
  799. X{    int    i, result, curr, diff = FALSE;
  800. X    Filter    *f, new;
  801. X
  802. X    if (selection_count() != 1)
  803. X       return(TRUE);
  804. X    curr = curr_selection();
  805. X    for (i = 0, f = edit_set; i < curr; i++, f = f->next)
  806. X       ;
  807. X    new = *f;
  808. X    if (update_values(&new, FALSE) == FALSE)
  809. X       diff = TRUE;
  810. X    else if ((f->start != NULL && new.start == NULL) || (f->start == NULL && new.start != NULL))
  811. X       diff = TRUE;
  812. X    else if ((f->stop != NULL && new.stop == NULL) || (f->stop == NULL && new.stop != NULL))
  813. X       diff = TRUE;
  814. X    else if ((f->comment != NULL && new.comment == NULL) || (f->comment == NULL && new.comment != NULL))
  815. X       diff = TRUE;
  816. X    else if ((f->command != NULL && new.command == NULL) || (f->command == NULL && new.command != NULL))
  817. X       diff = TRUE;
  818. X    else if (f->save != new.save || f->beep != new.beep || f->flash != new.flash || f->open != new.open || f->stamp != new.stamp)
  819. X       diff = TRUE;
  820. X    else if (f->start && strcmp(f->start, new.start) != 0)
  821. X       diff = TRUE;
  822. X    else if (f->stop && strcmp(f->stop, new.stop) != 0)
  823. X       diff = TRUE;
  824. X    else if (f->comment && strcmp(f->comment, new.comment) != 0)
  825. X       diff = TRUE;
  826. X    else if (f->command && strcmp(f->command, new.command) != 0)
  827. X       diff = TRUE;
  828. X    if (diff) {
  829. X       result = notice_prompt(contool_base->base, NULL,
  830. X                        NOTICE_MESSAGE_STRINGS,
  831. X                           "You have modified the attributes of the selected filter.",
  832. X                           " ",
  833. X                           "Do you wish to perform an Update before doing an Apply?",
  834. X                           NULL,
  835. X                        NOTICE_BUTTON_YES, "Update, then Apply",
  836. X                        NOTICE_BUTTON_NO, "Apply",
  837. X                        NOTICE_BUTTON, "Cancel", 101,
  838. X                     NULL);
  839. X       if (result == NOTICE_YES)
  840. X          filter_update(contool_filters->filters, NULL);
  841. X       return(result != 101);
  842. X       }
  843. X    return(TRUE);
  844. X}
  845. X
  846. X/************************************************************************/
  847. XEXPORT    void    accept_filters(item, event)
  848. X
  849. XPanel_item    item;
  850. XEvent        *event;
  851. X
  852. X{    Filter    *f;
  853. X    int    i, total;
  854. X    char    *msg = NULL;
  855. X
  856. X    if (!check_for_update()) {
  857. X       xv_set(item, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  858. X       return;
  859. X       }
  860. X
  861. X    total = (int) xv_get(contool_filters->filter_list, PANEL_LIST_NROWS);
  862. X    for (i = 0; i < total; i++)
  863. X       if (xv_get(contool_filters->filter_list, PANEL_LIST_SELECTED, i))
  864. X          xv_set(contool_filters->filter_list, PANEL_LIST_SELECT, i, FALSE, NULL);
  865. X    for (f = edit_set, i = 0; f; f = f->next, i++)
  866. X       if (is_empty(f->start) || (msg = compile_exp(f, f->start, f->stop))) {
  867. X          xv_set(contool_filters->filter_list, PANEL_LIST_SELECT, i, TRUE, NULL);
  868. X          update_controls();
  869. X          error(msg? msg : "No pattern is specified for the indicated filter");
  870. X          xv_set(item, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  871. X          return;
  872. X          }
  873. X    free_list(filters);
  874. X    filters = edit_set;
  875. X    if (xv_get(contool_filters->filters, FRAME_CMD_PUSHPIN_IN))
  876. X       edit_set = duplicate_list(filters);
  877. X    else {
  878. X       edit_set = NULL;
  879. X       free_list(clipboard);
  880. X       clipboard = NULL;
  881. X       }
  882. X    filters_changed();
  883. X}
  884. X
  885. X/************************************************************************/
  886. XEXPORT    void    reset_filters(item, event)
  887. X
  888. XPanel_item    item;
  889. XEvent        *event;
  890. X
  891. X{
  892. X    init_filters();
  893. X    xv_set(item, PANEL_NOTIFY_STATUS, XV_ERROR, NULL);
  894. X}
  895. END_OF_FILE
  896. if test 26766 -ne `wc -c <'filters.c'`; then
  897.     echo shar: \"'filters.c'\" unpacked with wrong size!
  898. fi
  899. # end of 'filters.c'
  900. fi
  901. echo shar: End of archive 5 \(of 6\).
  902. cp /dev/null ark5isdone
  903. MISSING=""
  904. for I in 1 2 3 4 5 6 ; do
  905.     if test ! -f ark${I}isdone ; then
  906.     MISSING="${MISSING} ${I}"
  907.     fi
  908. done
  909. if test "${MISSING}" = "" ; then
  910.     echo You have unpacked all 6 archives.
  911.     rm -f ark[1-9]isdone
  912. else
  913.     echo You still need to unpack the following archives:
  914.     echo "        " ${MISSING}
  915. fi
  916. ##  End of shell archive.
  917. exit 0
  918.  
  919. Chuck Musciano                ARPA  : chuck@trantor.harris-atd.com
  920. Harris Corporation             Usenet: ...!uunet!x102a!trantor!chuck
  921. PO Box 37, MS 3A/1912            AT&T  : (407) 727-6131
  922. Melbourne, FL 32902            FAX   : (407) 727-{5118,5227,4004}
  923.  
  924. I'm glad you asked, son.  Being popular
  925.     is the most important thing in the world.    -- Homer Simpson
  926.